package cz.agents.agentpolis.darptestbed.simulator.initializator.osm;
import java.util.Collection;
import java.util.Map;
import net.sf.javaml.core.kdtree.KDTree;
import org.openstreetmap.osm.data.coordinates.LatLon;
import com.google.common.collect.Maps;
import com.google.inject.AbstractModule;
import com.google.inject.Injector;
import com.google.inject.Provides;
import com.google.inject.Singleton;
import com.vividsolutions.jts.geom.Coordinate;
import cz.agents.agentpolis.simmodel.environment.model.citymodel.transportnetwork.elemets.Node;
import cz.agents.agentpolis.simmodel.environment.model.citymodel.transportnetwork.elemets.highway.HighwayNetwork;
import cz.agents.agentpolis.simmodel.environment.model.citymodel.transportnetwork.elemets.highway.HighwayNode;
import cz.agents.agentpolis.simulator.creator.initializator.InitModuleFactory;
import cz.agents.agentpolis.utils.spatialrefsys.WGS84Convertor;
public class NearestNodeInitModuleFactory implements InitModuleFactory {
private final int epsg;
public NearestNodeInitModuleFactory(int epsg) {
super();
this.epsg = epsg;
}
@Override
public AbstractModule injectModule(Injector injector) {
Collection<HighwayNode> allNetworkNodes = injector.getInstance(HighwayNetwork.class).getNetwork().getAllNodes();
WGS84Convertor wgs84Convertor = WGS84Convertor.createConvertorFromWGS84ToSpatialRefSys(epsg);
Map<Long, Coordinate> projectedNodeCoordinats = Maps.newHashMap();
final KDTree kdTree = new KDTree(2);
for (Node node : allNetworkNodes) {
LatLon latLon = node.getLatLon();
Coordinate coordinate = wgs84Convertor.convert(latLon.lon(), latLon.lat());
projectedNodeCoordinats.put(node.getId(), coordinate);
kdTree.insert(new double[] { coordinate.x, coordinate.y }, node.getId());
}
final NodeExtendedFunction nearestNodeFinder = new NodeExtendedFunction(projectedNodeCoordinats, kdTree,
wgs84Convertor);
return new AbstractModule() {
@Override
protected void configure() {
// TODO Auto-generated method stub
}
@Singleton
@Provides
public NodeExtendedFunction provideNearestNodeFinder() {
return nearestNodeFinder;
}
};
}
protected int getEPSG() {
return epsg;
}
}